HashTable中的哈希算法
下面是HashTable源码中的put方法:
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry<?,?> tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length; //注意这里
//下面的代码省略,注意上面一行
}
注意上面注释标注的地方:
int index = (hash & 0x7FFFFFFF) % tab.length; //注意这里
HashTable对于元素在哈希表中的坐标算法是:
- 将对象自身的哈希值key.hashCode()变为正数:hash & 0x7FFFFFFF
- 将上面得到的哈希值对表长取余,映射到哈希表中去。
HashMap中的哈希算法
HashMap中哈希算法比HashTable中的稍微复杂一点。总体可以分为两步:
一、重新计算key本身的哈希值
static final int hash(Object key) {
int h;